/*
 * lib/config.c
 * 用于在系统启动时，从配置文件中读取相关信息
 * 作者：cgc
 */

#include "../include/config.h"

/*
 * 描述： 打开配置文件并初始化数据
 * 返回值： 配置数据结构
 */
void
initconf()
{
	if((conf = malloc(sizeof(struct configure))) == NULL){
		//syslog(, "内存分配失败，initconf().\n");
		return;
	}
	int fd;
	if((fd = open(CONFIG_PATH, O_RDONLY))<0)	/* 以只读方式打开配置文件 */	
	{
		//syslog(, "打开配置文件失败,initconf().\n");
		return;
	}
	configure_read(fd);
}


/*
 * 描述: 读出config_buf中每一行的键值对,并设置到configure结构体中
 * config_buf: 从配置文件中读出的内容
 * config_size: config_buf的长度
 * 返回: void
 */
void
configure_read(int fd)
{
	int index=0;
	char *webport, *listenport, *mutilogin, *serverip, *serverport;
	char config_oneline_buf[100];		/* 读取配置文件中的每一行 */
	memset(config_oneline_buf, '\0', sizeof(config_oneline_buf));
	
	while(1){
		Readline(fd, config_oneline_buf, sizeof(config_oneline_buf));
		if(config_oneline_buf[0] == '#' || config_oneline_buf[0] == ' ' || config_oneline_buf[0] == '\r' || config_oneline_buf[0] == '\n')
			continue;
		else if(config_oneline_buf[0] == 'w')	/* webport */
		{	
			if((webport = malloc(7*sizeof(char))) == NULL){
				//syslog(, "分配内存失败，configure_read() for webport.\n");
				return;
			}						
			sscanf(config_oneline_buf, "webport=%s", webport);
			conf->webport = atoi(webport);
			free(webport);
			/* printf("webport:-->%d\n", conf->webport); */ 
		}
		else if(config_oneline_buf[0] == 'l')	/* listenport */
		{				
			if((listenport = malloc(7*sizeof(char))) == NULL){
				//syslog(, "分配内存失败，configure_read() for listenport.\n");
				return;
			}
			sscanf(config_oneline_buf, "listenport=%s", listenport);
			conf->listenport = atoi(listenport);
			free(listenport);
			/* printf("listenport:-->%d\n", conf->listenport); */
		}
		else if(config_oneline_buf[0] == 'c')	/* clientstatpath */
		{			
			memset(conf->clientstatpath, '\0', sizeof(conf->clientstatpath));	
			sscanf(config_oneline_buf, "clientstatpath=%s", conf->clientstatpath);
			/* printf("clientstatpath:-->%s\n", conf->clientstatpath); */
		}
		else if(config_oneline_buf[0] == 't')	/* taskupdatepath */
		{				
			memset(conf->taskupdatepath, '\0', sizeof(conf->taskupdatepath));
			sscanf(config_oneline_buf, "taskupdatepath=%s", conf->taskupdatepath);
			/* printf("taskupdatepath:-->%s\n", conf->taskupdatepath); */
		}
		else if(config_oneline_buf[0] == 'p')	/* password */
		{				
			memset(conf->password, '\0', sizeof(conf->password));
			sscanf(config_oneline_buf, "password=%s", conf->password);
			/* printf("password;-->%s\n", conf->password); */
		}
		else if(config_oneline_buf[0] == 'm')	/* mutilogin */
		{				
			if((mutilogin = malloc(2*sizeof(char))) == NULL){
				//syslog(, "分配内存失败，configure_read() for mutilogin.\n");
				return;
			}
			sscanf(config_oneline_buf, "mutilogin=%s",mutilogin);
			conf->mutilogin = atoi(mutilogin);
			free(mutilogin);
			/* printf("mutilogin:-->%d\n", conf->mutilogin); */
		}
		else if(config_oneline_buf[0] == 's' && config_oneline_buf[6] == 'i')	/* serverip */
		{				
			if((serverip = malloc(7*sizeof(char))) == NULL){
				//syslog(, "分配内存失败，configure_read() for serverip.\n");
				return;
			}
			sscanf(config_oneline_buf, "serverip=%s", serverip);
			conf->serverip = atoi(serverip);
			free(serverip);
			/* printf("serverip:-->%d\n", conf->serverip); */
		}
		else if(config_oneline_buf[0] == 's' && config_oneline_buf[6] == 'p')	/* serverport */
		{				
			if((serverport = malloc(7*sizeof(char))) == NULL){
				//syslog(, "分配内存失败，configure_read() for serverport.\n");
				return;
			}
			sscanf(config_oneline_buf, "serverport=%s", serverport);
			conf->serverport = atoi(serverport);
			free(serverport);
			/* printf("serverport:-->%d\n", conf->serverport); */
		}
		else if(config_oneline_buf[0] == '\0')		/* 已读到末尾 */
			break;
		else 
			break;
	}
}

/* 
 * 描述: 读取打开描述符文件或套接口中一行内容 
 * fd: 打开的文件或套接口描述符
 * vptr: 存放读取到一行的内容
 * maxlen: 一行最多读取的大小
 * 返回: 读到的字节数 成功;  -1 失败
 */
ssize_t    
readline(int fd, void *vptr, size_t maxlen)
{
	ssize_t n,rc;
	char c, *ptr;
	
	ptr = vptr;
	for(n = 1; n < maxlen; n++)
	{
		again:
			if((rc = read(fd, &c, 1)) == 1)
			{
				*ptr++ = c;
				if(c == '\n')
					break;		/* 已经读完了一行 */
			}
			else if(rc == 0)
			{
				*ptr = 0;
				return(n-1);	/* EOF,读到n-1字节 */
			}
			else
			{
				if(errno == EINTR)
					goto again;
				return -1;
			}
	}
	*ptr = 0;
	return(n);
}

ssize_t    
Readline(int fd, void *vptr, size_t maxlen)
{
	ssize_t n;
	if((n = readline(fd, vptr, maxlen)) < 0)
	{
		printf("read error!\n");
		return -1;
	}
	return n;	
}


